﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{

    //备忘录模式能够为我们捕获每一个历史瞬间，以便我们回溯历史。
    //但是注意在元数据对象体积太大的时候或者无限制地对元数据对象继续快照备份操作，都可能会导致内存空间资源的过度耗费，
    //使系统性能越变越差，此时我们需要给备忘录添加一个容量限制。

    #region 备忘录模式在文本编辑器上的使用
    //备忘录：历史快照
    public class History
    {
        private string body;
        public History(string body)
        {
            this.body = body;
        }
        public string GetBody()
        {
            return this.body;
        }
    }
    //原发器：文档元对象类
    public class Doc
    {
        public string Title { set; get; }
        public string Body { set; get; }
        public Doc(string title)
        {
            this.Title = title;
            this.Body = "";
        }

        public History CreateHistory()
        {
            return new History(this.Body);
        }

        public void RestoreHistory(History history)
        {
            this.Body = history.GetBody();
        }
    }

    /// <summary>
    /// 负责人/管理者：编辑器
    /// </summary>
    public class Editor
    {
        /// <summary>
        /// 文档元对象
        /// </summary>
        public Doc Doc;
        /// <summary>
        /// 历史快照
        /// </summary>
        private List<History> Histories;
        /// <summary>
        /// 历史快照指针
        /// </summary>
        private int historyPosition = -1;


        public Editor(Doc doc)
        {
            this.Doc = doc;
            Histories = new List<History>();
            this.BackUp();
        }

        /// <summary>
        /// 记录历史快照
        /// </summary>
        public void BackUp()
        {
            if(Histories.Count>20)
            {
                Histories.Remove(Histories[0]);
            }
            Histories.Add(this.Doc.CreateHistory());
            historyPosition++;
        }
        /// <summary>
        /// 恢复到上一历史快照
        /// </summary>
        public void Undo()
        {
            if (historyPosition <= 0)
            {
                return;
            }
            else
            {
                this.Histories.RemoveAt(historyPosition);
                historyPosition--;        
                this.Doc.RestoreHistory(this.Histories[this.historyPosition]);
              
            }
        }
    }
    #endregion
}
